
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import messages.*;

public class Destinataire {

	public static final int DEST_PORT = 2014; 
	public static final int LISTENED_PORT = 2013; 
	public static final int LISTENED_PORT_TCP = 2015; 
	public static final int DEST_PORT_TCP = 2016;
	
	public static void rcvFile(ServerSocket serverSocket, File file){
		Socket echange_donnee;
		InputStream fichierDEntree;
		OutputStream fichierDeSortie;
		while(true){
		try {
			echange_donnee=serverSocket.accept();
			fichierDEntree = echange_donnee.getInputStream();
			fichierDeSortie = new FileOutputStream(file);
			
			byte[] toRcv = new byte[4096];
			int i;
			while (( i = fichierDEntree.read(toRcv)) != -1){
				fichierDeSortie.write(toRcv, 0, i);
			}
			
			fichierDEntree.close();
			fichierDeSortie.close();
			echange_donnee.close();
		} catch (IOException e) {
			System.out.println("probleme avec l'accept de la socket");
			e.printStackTrace();
		}
		}
	}
	
	public static void main(String[] args) {		
		ServerSocket serverSocket = null;
		File file = new File("/home/guillaume/workspace/copie.mp3");
		try {
			serverSocket = new ServerSocket(1236);
			rcvFile(serverSocket, file);
		} catch (IOException e) {
			System.out.println("creation socket ratée !");
			e.printStackTrace();
		}
		
	}
		
		//	try {
			
//			boolean request;
//			boolean accepted;
//			
///*---------------------------------------------------------------------------------------*/
///*Attente et réception d'un message------------------------------------------------------*/	
//			DatagramSocket mySocketEcoute;
//			byte[] recvData;
//			DatagramPacket myPacket;
//			
//			
//			mySocketEcoute = new DatagramSocket(LISTENED_PORT);
//			int size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
//			recvData = new byte[size];
//			myPacket = new DatagramPacket(recvData, recvData.length);
//			mySocketEcoute.receive(myPacket);
//
//			System.out.println("Attente d'un message\n");
//			
//			Message recvMessage = MessagesFactory.getMessage(myPacket.getData());
//
//			System.out.println("Un message à été reçu");
//			System.out.println("Le message est du type " + recvMessage.getClass());
//			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());
//
//			if (recvMessage instanceof Hello) {
//				if (((Hello)recvMessage).getWaitAck()) {
//					System.out.println("L'application distante attend un ack\n");
//				}
//				else {
//					System.out.println("L'application distante n'attend pas de ack\n");
//				}
//			}
//			else if (recvMessage instanceof ChatMessage){
//				System.out.println("Le message suivant a été reçu :");
//				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
//			}
///*
///*--------------------------------------------------------------------------------------*/
///*Emission d'un Hello demandant PAS un ack -------------------------------------------------*/	
//			//mySocket = null;
//			DatagramSocket mySocketEnvoi;
//			byte[] myHelloAck;
//			
//			System.out.println("Envoie d'un HelloAck");
//			
//			myHelloAck = MessagesFactory.getHello("DonDiegoDeLaVega", false);
//			
//			mySocketEnvoi = new DatagramSocket();
//			mySocketEnvoi.send(new DatagramPacket(myHelloAck, myHelloAck.length, 
//										      InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//			
//			System.out.println("HelloAck envoyé\n");
//			
///*---------------------------------------------------------------------------------------*/
///*Attente et réception d'un message peut-etre d'un ChatMessage, qui sait ...------------*/	
//			//mySocket=null;
//			recvData = null;
//			myPacket=null;
//						
//			//mySocket = new DatagramSocket(12345);
//			size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
//			System.out.println("j'ai reçu qq chose");
//			recvData = new byte[size];
//			myPacket = new DatagramPacket(recvData, recvData.length);
//			System.out.println("extraction paquet");
//			mySocketEcoute.receive(myPacket);
//			System.out.println("Attente d'un message\n");
//			recvMessage = MessagesFactory.getMessage(myPacket.getData());
//			System.out.println("Un message à été reçu");
//			System.out.println("Le message est du type " + recvMessage.getClass());
//			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());
//
//			if (recvMessage instanceof Hello) {
//				if (((Hello)recvMessage).getWaitAck()) {
//					System.out.println("L'application distante attend un ack\n");
//				}
//				else {
//					System.out.println("L'application distante n'attend pas de ack\n");
//				}
//			}
//			else if (recvMessage instanceof ChatMessage){
//				System.out.println("Le message suivant a été reçu :");
//				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
//			}
//			
//			
///*---------------------------------------------------------------------------------------*/
///*Emmission d'un ChatMessage-------------------------------------------------------------*/
//			mySocketEnvoi = null;
//			byte[] myChatMessageByteArray;
//			System.out.println("envoi d'un message");
//			
//			mySocketEnvoi = new DatagramSocket();
//			myChatMessageByteArray = MessagesFactory.getChatMessage("DonDiegoDeLaVega", "Je crois que oui Sergent");
//			mySocketEnvoi.send(new DatagramPacket(myChatMessageByteArray,
//					myChatMessageByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//			
//			System.out.println("Message envoyé !!");
//			
///*---------------------------------------------------------------------------------------*/
///*Attente et réception d'une demande de reception de fichier-----------------------------*/	
//			
//			recvData = null;
//			myPacket=null;
//
//			size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
//			System.out.println("j'ai reçu qq chose");
//			recvData = new byte[size];
//			myPacket = new DatagramPacket(recvData, recvData.length);
//			System.out.println("extraction paquet");
//			mySocketEcoute.receive(myPacket);
//			System.out.println("Attente d'un message\n");
//			recvMessage = MessagesFactory.getMessage(myPacket.getData());
//			System.out.println("Un message à été reçu");
//			System.out.println("Le message est du type " + recvMessage.getClass());
//			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());
//
//			if (recvMessage instanceof Hello) {
//				if (((Hello)recvMessage).getWaitAck()) {
//					System.out.println("L'application distante attend un ack\n");
//				}
//				else {
//					System.out.println("L'application distante n'attend pas de ack\n");
//				}
//			}
//			else if (recvMessage instanceof ChatMessage){
//				System.out.println("Le message suivant a été reçu :");
//				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
//			}
//			else if (recvMessage instanceof FileNotif){
//				/*-------------------------------------
//				 * On reçoit une demande de fichier----
//				 -------------------------------------*/
//				if (((FileNotif)recvMessage).getRequest() == true){
//					System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " souhaite vous envoyez le fichier suivant : " + 
//							((FileNotif)recvMessage).getNameFile() + " voulez-vous l'accepter ?");
//					request=false;
//					accepted = true;
//					/*-------------------------------------
//					 * On accepte le fichier---------------
//					 -------------------------------------*/
//					mySocketEnvoi = null;
//					String nomFicher = ((FileNotif)recvMessage).getNameFile();
//					byte[] myFileNotifByteArray;
//					System.out.println("envoi d'une acceptation de reception");
//					
//					mySocketEnvoi = new DatagramSocket();
//					myFileNotifByteArray = MessagesFactory.getFileNotif("DonDiegoDeLaVega", nomFicher, request, accepted);
//					mySocketEnvoi.send(new DatagramPacket(myFileNotifByteArray,
//							myFileNotifByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//					System.out.println("Acceptation envoyée !!");
//					
//				}
//				else if (((FileNotif)recvMessage).getRequest() == true){
//					System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " souhaite vous envoyez le fichier suivant : " + 
//							((FileNotif)recvMessage).getNameFile() + " voulez-vous l'accepter ?");
//					request=false;
//					accepted = false;
//					/*-------------------------------------
//					 * On refuse le fichier---------------
//					 -------------------------------------*/
//					mySocketEnvoi = null;
//					String nomFicher = ((FileNotif)recvMessage).getNameFile();
//					byte[] myFileNotifByteArray;
//					System.out.println("envoi d'une acceptation de reception");
//					
//					mySocketEnvoi = new DatagramSocket();
//					myFileNotifByteArray = MessagesFactory.getFileNotif("DonDiegoDeLaVega", nomFicher, request, accepted);
//					mySocketEnvoi.send(new DatagramPacket(myFileNotifByteArray,
//							myFileNotifByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
//					System.out.println("Acceptation envoyée !!");
//					
//				}
//				/*-------------------------------------
//				 * On reçoit un acceptation de fichier-
//				 -------------------------------------*/
//				else if ((((FileNotif)recvMessage).getRequest() == false) && ((((FileNotif)recvMessage).getAccepted() == true))){
//					System.out.println("Le fichier a était accepté il va s'envoyer !");
//					
//				}
//			}
//			
			
/*		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (MessageCreationException e) {
			e.printStackTrace();
		} 
		

	}*/
}